package proyecto.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import javax.sql.DataSource;
import proyecto.excepcion.DAOExcepcion;
import proyecto.excepcion.LoginExcepcion;
import proyecto.modelo.Postulante;
import proyecto.modelo.Distrito;
import proyecto.modelo.TipoDocumentoIdentidad;

public class PostulanteDAOImpl extends BaseDAO implements PostulanteDAO {

    private DataSource dataSource;

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public Collection<Postulante> buscarPorNombre(String descripcion)
            throws DAOExcepcion {
        String query = "SELECT 	POS_CODIGO, dis.DIS_CODIGO, dis.DIS_DESCRIPCION, tip.TIPDOCIDE_CODIGO, tip.TIPDOCIDE_DESCRIPCION" +
	" POS_NOMBRE, POS_APELLIDOPATERNO, POS_APELLIDOMATERNO, POS_SEXO, " +
	" POS_NUMERODOCUMENTO, POS_CORREOELECTRONICO, POS_DOMICILIO, POS_NUMEROCELULAR, POS_TELEFONOFIJO, " +
	" POS_USUARIO, POS_CONTRASENA" +
	" FROM postulante pos, tipodocumentoidentidad tip, distrito dis" +
	" WHERE pos.TIPDOCIDE_CODIGO = tip.TIPDOCIDE_CODIGO" +
	" AND pos.DIS_CODIGO = dis.DIS_CODIGO" +
                " AND POS_APELLIDOPATERNO like ?";


        Collection<Postulante> lista = new ArrayList<Postulante>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, "%" + descripcion + "%");

            rs = stmt.executeQuery();
            while (rs.next()) {
                Postulante vo = new Postulante();
                vo.setPos_Codigo(rs.getInt("EMP_CODIGO"));
                vo.setPos_Nombre(rs.getString("POS_NOMBRE"));
                vo.setPos_ApellidoPaterno(rs.getString("POS_APELLIDOPATERNO"));
                vo.setPos_ApellidoPaterno(rs.getString("POS_APELLIDOMATERNO"));
                vo.setPos_Sexo(rs.getString("POS_SEXO"));
                vo.setPos_NumeroDocumento(rs.getString("POS_NUMERODOCUMENTO"));
                vo.setPos_CorreoElectronico(rs.getString("POS_CORREOELECTRONICO"));
                vo.setPos_Domicilio(rs.getString("POS_DOMICILIO"));
                vo.setPos_NumeroCelular(rs.getString("POS_NUMEROCELULAR"));
                vo.setPos_TelefonoFijo(rs.getString("POS_TELEFONOFIJO"));
                vo.setPos_Usuario(rs.getString("POS_USUARIO"));
                vo.setPos_Contrasena(rs.getString("POS_CONTRASENA"));

                Distrito distrito = new Distrito();
                distrito.setDis_Codigo(rs.getInt("DIS_CODIGO"));
                distrito.setDis_Descripcion(rs.getString("DIS_DESCRIPCION"));

                TipoDocumentoIdentidad tipoDocumentoIdentidad = new TipoDocumentoIdentidad();
                tipoDocumentoIdentidad.setTipDocIde_Codigo(rs.getInt("TIPDOCIDE_CODIGO"));
                tipoDocumentoIdentidad.setTipDocIde_Descripcion(rs.getString("TIPDOCIDE_DESCRIPCION"));

                vo.setDistrito(distrito);
                vo.setTipoDocumentoIdentidad(tipoDocumentoIdentidad);

                lista.add(vo);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        System.out.println(lista.size());
        return lista;
    }

    public Postulante insertar(Postulante vo) throws DAOExcepcion {
        String query = "INSERT INTO postulante " +
	" (POS_CODIGO, " +
	" DIS_CODIGO, " +
	" TIPDOCIDE_CODIGO, " +
	" POS_NOMBRE, " +
	" POS_APELLIDOPATERNO, " +
	" POS_APELLIDOMATERNO, " +
	" POS_SEXO, " +
	" POS_NUMERODOCUMENTO, " +
	" POS_CORREOELECTRONICO, " +
	" POS_DOMICILIO, " +
	" POS_NUMEROCELULAR, " +
	" POS_TELEFONOFIJO, " +
	" POS_USUARIO, " +
	" POS_CONTRASENA" +
	" )" +
	" VALUES" +
	" (?, ?,?, ?, ?, ?, ?, ?, ?,?,?, ?, ?, ?" +
	" );";
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setInt(1, vo.getPos_Codigo());
            stmt.setInt(2, vo.getDistrito().getDis_Codigo());
            stmt.setInt(3, vo.getTipoDocumentoIdentidad().getTipDocIde_Codigo());
            stmt.setString(4, vo.getPos_Nombre());
            stmt.setString(5, vo.getPos_ApellidoPaterno());
            stmt.setString(6, vo.getPos_ApellidoMaterno());
            //stmt.setDate(7, vo.getPos_FechaNacimiento());
            stmt.setString(7, vo.getPos_Sexo());
            stmt.setString(8, vo.getPos_NumeroDocumento());
            stmt.setString(9, vo.getPos_CorreoElectronico());
            stmt.setString(10, vo.getPos_Domicilio());
            stmt.setString(11, vo.getPos_NumeroCelular());
            stmt.setString(12, vo.getPos_TelefonoFijo());
            stmt.setString(13, vo.getPos_Usuario());
            stmt.setString(14, vo.getPos_Contrasena());

            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo insertar");
            }
            // Obtener el ultimo id
            int id = 0;
            query = "SELECT LAST_INSERT_ID()";
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            if (rs.next()) {
                id = rs.getInt(1);
            }

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }

    public Postulante obtener(String codigo) throws DAOExcepcion {
        Postulante vo = new Postulante();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            String query = "SELECT 	POS_CODIGO, dis.DIS_CODIGO, dis.DIS_DESCRIPCION, tip.TIPDOCIDE_CODIGO, tip.TIPDOCIDE_DESCRIPCION" +
	" POS_NOMBRE, POS_APELLIDOPATERNO, POS_APELLIDOMATERNO, POS_SEXO, " +
	" POS_NUMERODOCUMENTO, POS_CORREOELECTRONICO, POS_DOMICILIO, POS_NUMEROCELULAR, POS_TELEFONOFIJO, " +
	" POS_USUARIO, POS_CONTRASENA" +
	" FROM postulante pos, tipodocumentoidentidad tip, distrito dis" +
	" WHERE pos.TIPDOCIDE_CODIGO = tip.TIPDOCIDE_CODIGO" +
	" AND pos.DIS_CODIGO = dis.DIS_CODIGO" +
                    " AND POS_CODIGO = ?";
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, codigo);
            rs = stmt.executeQuery();
            if (rs.next()) {
                vo.setPos_Codigo(rs.getInt("EMP_CODIGO"));
                vo.setPos_Nombre(rs.getString("POS_NOMBRE"));
                vo.setPos_ApellidoPaterno(rs.getString("POS_APELLIDOPATERNO"));
                vo.setPos_ApellidoPaterno(rs.getString("POS_APELLIDOMATERNO"));
                vo.setPos_Sexo(rs.getString("POS_SEXO"));
                vo.setPos_NumeroDocumento(rs.getString("POS_NUMERODOCUMENTO"));
                vo.setPos_CorreoElectronico(rs.getString("POS_CORREOELECTRONICO"));
                vo.setPos_Domicilio(rs.getString("POS_DOMICILIO"));
                vo.setPos_NumeroCelular(rs.getString("POS_NUMEROCELULAR"));
                vo.setPos_TelefonoFijo(rs.getString("POS_TELEFONOFIJO"));
                vo.setPos_Usuario(rs.getString("POS_USUARIO"));
                vo.setPos_Contrasena(rs.getString("POS_CONTRASENA"));

                Distrito distrito = new Distrito();
                distrito.setDis_Codigo(rs.getInt("DIS_CODIGO"));
                distrito.setDis_Descripcion(rs.getString("DIS_DESCRIPCION"));

                TipoDocumentoIdentidad tipoDocumentoIdentidad = new TipoDocumentoIdentidad();
                tipoDocumentoIdentidad.setTipDocIde_Codigo(rs.getInt("TIPDOCIDE_CODIGO"));
                tipoDocumentoIdentidad.setTipDocIde_Descripcion(rs.getString("TIPDOCIDE_DESCRIPCION"));

                vo.setDistrito(distrito);
                vo.setTipoDocumentoIdentidad(tipoDocumentoIdentidad);
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }

    public void eliminar(String codigo) throws DAOExcepcion {
        String query = "DELETE FROM Postulante WHERE POS_CODIGO=?";
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, codigo);
            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo eliminar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
    }

    public Postulante actualizar(Postulante vo) throws DAOExcepcion {
        String query = "UPDATE empleado " +
	" SET" +
	" ARE_CODIGO = ? , " +
	" CAR_CODIGO = ? , " +
	" EMP_NOMBRE = ? , " +
	" EMP_APELLIDOPATERNO = ? , " +
	" EMP_APELLIDOMATERNO = ? , " +
	" EMP_FECHANACIMIENTO = ? , " +
	" EMP_FECHAINGRESO = ? , " +
	" EMP_SEXO = ? , " +
	" EMP_SUELDO = ? , " +
	" EMP_JEFE = ? , " +
	" EMP_CONTRASENA = ?" +
	" WHERE" +
	" EMP_CODIGO = ? ;";
        Connection con = null;
        PreparedStatement stmt = null;
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);

            stmt.setInt(1, vo.getPos_Codigo());
            stmt.setInt(2, vo.getDistrito().getDis_Codigo());
            stmt.setInt(3, vo.getTipoDocumentoIdentidad().getTipDocIde_Codigo());
            stmt.setString(4, vo.getPos_Nombre());
            stmt.setString(5, vo.getPos_ApellidoPaterno());
            stmt.setString(6, vo.getPos_ApellidoMaterno());
            //stmt.setDate(7, vo.getPos_FechaNacimiento());
            stmt.setString(7, vo.getPos_Sexo());
            stmt.setString(8, vo.getPos_NumeroDocumento());
            stmt.setString(9, vo.getPos_CorreoElectronico());
            stmt.setString(10, vo.getPos_Domicilio());
            stmt.setString(11, vo.getPos_NumeroCelular());
            stmt.setString(12, vo.getPos_TelefonoFijo());
            stmt.setString(13, vo.getPos_Usuario());
            stmt.setString(14, vo.getPos_Contrasena());

            int i = stmt.executeUpdate();
            if (i != 1) {
                throw new SQLException("No se pudo actualizar");
            }
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }

    public Collection<Postulante> listar() throws DAOExcepcion {
        Collection<Postulante> lista = new ArrayList<Postulante>();
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            String query = "SELECT 	POS_CODIGO, dis.DIS_CODIGO, dis.DIS_DESCRIPCION, tip.TIPDOCIDE_CODIGO, tip.TIPDOCIDE_DESCRIPCION" +
	" POS_NOMBRE, POS_APELLIDOPATERNO, POS_APELLIDOMATERNO, POS_SEXO, " +
	" POS_NUMERODOCUMENTO, POS_CORREOELECTRONICO, POS_DOMICILIO, POS_NUMEROCELULAR, POS_TELEFONOFIJO, " +
	" POS_USUARIO, POS_CONTRASENA" +
	" FROM postulante pos, tipodocumentoidentidad tip, distrito dis" +
	" WHERE pos.TIPDOCIDE_CODIGO = tip.TIPDOCIDE_CODIGO" +
	" AND pos.DIS_CODIGO = dis.DIS_CODIGO";
            stmt = con.prepareStatement(query);
            rs = stmt.executeQuery();
            while (rs.next()) {
                Postulante vo = new Postulante();
               vo.setPos_Codigo(rs.getInt("EMP_CODIGO"));
                vo.setPos_Nombre(rs.getString("POS_NOMBRE"));
                vo.setPos_ApellidoPaterno(rs.getString("POS_APELLIDOPATERNO"));
                vo.setPos_ApellidoPaterno(rs.getString("POS_APELLIDOMATERNO"));
                vo.setPos_Sexo(rs.getString("POS_SEXO"));
                vo.setPos_NumeroDocumento(rs.getString("POS_NUMERODOCUMENTO"));
                vo.setPos_CorreoElectronico(rs.getString("POS_CORREOELECTRONICO"));
                vo.setPos_Domicilio(rs.getString("POS_DOMICILIO"));
                vo.setPos_NumeroCelular(rs.getString("POS_NUMEROCELULAR"));
                vo.setPos_TelefonoFijo(rs.getString("POS_TELEFONOFIJO"));
                vo.setPos_Usuario(rs.getString("POS_USUARIO"));
                vo.setPos_Contrasena(rs.getString("POS_CONTRASENA"));

                Distrito distrito = new Distrito();
                distrito.setDis_Codigo(rs.getInt("DIS_CODIGO"));
                distrito.setDis_Descripcion(rs.getString("DIS_DESCRIPCION"));

                TipoDocumentoIdentidad tipoDocumentoIdentidad = new TipoDocumentoIdentidad();
                tipoDocumentoIdentidad.setTipDocIde_Codigo(rs.getInt("TIPDOCIDE_CODIGO"));
                tipoDocumentoIdentidad.setTipDocIde_Descripcion(rs.getString("TIPDOCIDE_DESCRIPCION"));

                vo.setDistrito(distrito);
                vo.setTipoDocumentoIdentidad(tipoDocumentoIdentidad);
                
                lista.add(vo);
            }

        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return lista;
    }

    public Postulante validar(String usuario, String clave) throws DAOExcepcion, LoginExcepcion {
        System.out.println("UsuarioDAOImpl: validar: usuario: " + usuario + ", clave: " + clave);
        String query = "SELECT 	POS_CODIGO, dis.DIS_CODIGO, dis.DIS_DESCRIPCION, tip.TIPDOCIDE_CODIGO, tip.TIPDOCIDE_DESCRIPCION" +
	" POS_NOMBRE, POS_APELLIDOPATERNO, POS_APELLIDOMATERNO, POS_SEXO, " +
	" POS_NUMERODOCUMENTO, POS_CORREOELECTRONICO, POS_DOMICILIO, POS_NUMEROCELULAR, POS_TELEFONOFIJO, " +
	" POS_USUARIO, POS_CONTRASENA" +
	" FROM postulante pos, tipodocumentoidentidad tip, distrito dis" +
	" WHERE pos.TIPDOCIDE_CODIGO = tip.TIPDOCIDE_CODIGO" +
	" AND pos.DIS_CODIGO = dis.DIS_CODIGO" +
                " AND emp.ARE_CODIGO = are.ARE_CODIGO And EMP_CODIGO=? and EMP_CONTRASENA=?";
        Connection con = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Postulante vo = new Postulante();
        try {
            con = dataSource.getConnection();
            stmt = con.prepareStatement(query);
            stmt.setString(1, usuario);
            stmt.setString(2, clave);
            rs = stmt.executeQuery();

            if (rs.next()) {
                vo.setPos_Codigo(rs.getInt("EMP_CODIGO"));
                vo.setPos_Nombre(rs.getString("POS_NOMBRE"));
                vo.setPos_ApellidoPaterno(rs.getString("POS_APELLIDOPATERNO"));
                vo.setPos_ApellidoPaterno(rs.getString("POS_APELLIDOMATERNO"));
                vo.setPos_Sexo(rs.getString("POS_SEXO"));
                vo.setPos_NumeroDocumento(rs.getString("POS_NUMERODOCUMENTO"));
                vo.setPos_CorreoElectronico(rs.getString("POS_CORREOELECTRONICO"));
                vo.setPos_Domicilio(rs.getString("POS_DOMICILIO"));
                vo.setPos_NumeroCelular(rs.getString("POS_NUMEROCELULAR"));
                vo.setPos_TelefonoFijo(rs.getString("POS_TELEFONOFIJO"));
                vo.setPos_Usuario(rs.getString("POS_USUARIO"));
                vo.setPos_Contrasena(rs.getString("POS_CONTRASENA"));

                Distrito distrito = new Distrito();
                distrito.setDis_Codigo(rs.getInt("DIS_CODIGO"));
                distrito.setDis_Descripcion(rs.getString("DIS_DESCRIPCION"));

                TipoDocumentoIdentidad tipoDocumentoIdentidad = new TipoDocumentoIdentidad();
                tipoDocumentoIdentidad.setTipDocIde_Codigo(rs.getInt("TIPDOCIDE_CODIGO"));
                tipoDocumentoIdentidad.setTipDocIde_Descripcion(rs.getString("TIPDOCIDE_DESCRIPCION"));

                vo.setDistrito(distrito);
                vo.setTipoDocumentoIdentidad(tipoDocumentoIdentidad);

            } else {
                throw new LoginExcepcion("No existe");
            }
        } catch (LoginExcepcion e) {
            System.err.println(e.getMessage());
            throw e;
        } catch (SQLException e) {
            System.err.println(e.getMessage());
            throw new DAOExcepcion(e.getMessage());
        } finally {
            this.cerrarResultSet(rs);
            this.cerrarStatement(stmt);
            this.cerrarConexion(con);
        }
        return vo;
    }
}
